草庐IT

shell 运算符

全部标签

C++强制运算符==从接口(interface)抽象类重载

在C++上使用接口(interface)(抽象类)我需要强制任何类而不是继承接口(interface)来实现运算符==。考虑这种情况:classIBase{virtualvoidsomeFunc()const=0;}classCInheritClass:publicIBase{virtualvoidsomeFunc()const;virtualbooloperator==(constCInheritClass&obj)const;}voidmain(){CInheritClassinstance;}类CInheritClass必须实现someFunc因为它继承了Ibase,实现了vir

c++ - 测试是否存在左移运算符

我正在尝试找到一个工作类型特征来检测给定类型是否具有std::ostream的左移运算符重载(例如,可与std::cout或boost::lexical_cast互操作)。我在boost::has_left_shift上取得了成功除了类型是POD或std::string的STL容器的情况类型。我怀疑这与STL类型或operatorstd::ostream的有效左移运算符一般识别类型的正确方法是什么??如果那不可行,是否有单独的方法来检测POD或std::string类型的STL容器上左移运算符的过载?下面的代码显示了我目前正在使用的内容,并演示了如何boost::has_left_sh

c++ - 没有 return 语句的重载赋值运算符

为什么允许赋值运算符返回void?为什么赋值链在这种情况下有效?看看代码,就会很清楚我在说什么。代码:structFoo{std::stringstr;Foo(conststd::string&_str):str(_str){}Foo&operator=(constFoo&_foo){str=_foo.str;//return*this;/*NORETURN!*/}};intmain(){Foof1("1");Foof2("2");Foof3("3");f1=f2=f3=Foo("4");std::cout问题:为什么这是合法的?(为什么要编译)为什么有效?我在很多地方读到“赋值运算符

c++ - C++ 中的空传播运算符

有没有人在C++中实现了空传播运算符,类似于函数式语言中使用的运算符?我正在考虑一些巧妙的模板解决方案,可能类似于运算符->的传播行为。假设我们有一个来自图形的对象链,例如foo->bar->baz(抱歉,得墨忒耳法则)。假设其中任何一个都可以为空,并且应该在取消引用之前进行测试。然后代码突然变得复杂多了:if(!foo)returnnullptr;if(!foo->bar)returnnullptr;returnfoo->bar->baz;我想用像这样的某种紧凑语法“排除”空值检查:foo?->bar?->baz//imaginarynull-propagationsyntax当然,

c# - 比较运算符性能 <= 对 !=

让我们从声明代码可读性胜过微优化开始,我们宁愿将其留给编译器。这只是一个奇怪的案例,其中的细节似乎与一般建议相比很有趣因此搞乱了质数生成器函数,并提出了一个奇怪的行为,其中人们建议最有效的“!=”实际上是最不有效的,而“C#privatestaticvoidMain(string[]args){longtotalTicks=0;for(inti=0;i输出:在C++中类似(在不同的机器上)include#includeintmain(){for(size_ti(0);i输出:循环运行的次数相同。是否有任何优化?这不适用于!=还是一些奇怪的CPU行为? 最佳答

c++ - 旧版本的 C++ 在评估 `int` 语句中的条件时是否使用了类的 `if()` 运算符?

现代版本的C++在评估if()语句中的条件时尝试使用类的bool运算符。其他转换运算符,例如int在不存在bool运算符时使用。如下所示。#includeusingnamespacestd;classTwoInts{public:inta,b;operatorbool(){cout运行这段代码不会产生任何意外:TwoIntstoboolSixIntstoint查看一些旧的C++代码,似乎有一个更改需要验证。旧版本的C++在评估if()语句中的条件时是否使用了类的int运算符?什么版本(如果有)做过某事?那么建议的输出应该是TwoIntstointSixIntstoint关于问题原因的一

c++ - 无法理解逗号运算符的工作原理

在下面的程序中,我重载了commaoperator。但是,为什么commaoperator没有考虑到firstelement/object。classPoint{intx,y;public:Point(){}Point(intpx,intpy){x=px;y=py;}voidshow(){cout我也试图理解,运算符,但找不到解决方案。ob1=(ob1,ob2+ob2,ob3);//Whycontrolisnotreachingcommaoperatorforob1?ob1=(ob3,ob2+ob2,ob1);//Whycontrolisnotreachingcommaoperator

c++ - 数组错误指针的增量运算符?

我正在尝试一些非常简单的事情,本来应该很简单,但不知何故它让我很困惑......我试图理解++在被视为指针时对数组的影响以及在被视为数组时对指针的影响。所以,intmain(){inta[4]={1,4,7,9};*a=3;*(a+1)=4;*++a=4;//compilererror}1:所以在*(a+1)=4我们设置a[1]=4;//快乐的但是当*++a=4;时,我希望指针a递增1,因为++先于*然后*开始,我们使它等于4。但是这段代码只是行不通...这是为什么?另一个问题:intmain(){int*p=(int*)malloc(8);*p=5;printf("%d",p[0])

c++ - 如何在 C++ 中重载非交换运算符的两种可能性?

我目前正在为复数创建一个类,所以我想让它更容易,我允许像a=b+c这样的操作,而不是a=b.add(c)。例如,这是我对两个复数相加的实现://AnadditionoperatorforthecomplexnumbersComplexComplex::operator+(Complexn){returnComplex(this->real+n.real,this->imaginary+n.imaginary);}在此示例中,添加复数a+b与添加b+a具有相同的结果,因为它们应该如此。但是,在处理非交换运算符和整数时会出现问题。例如,除以整数或除以整数。我怎样才能做到:a=复数/整数和a

C++ 指针与数组的 [] 运算符比较?

我一直在阅读book这表示通过指针算法访问数组元素比[]运算符快得多。总之this代码比this快代码。书中没有说为什么。是否建议使用此类指针算法,即使它可以显着提高速度?#includeusingnamespacestd;intmain(){//yourcodegoesheredouble*array=newdouble[1000000];for(inti=0;iusingnamespacestd;intmain(){//yourcodegoesheredouble*array=newdouble[1000000];for(inti=0;i编辑:引自书第369页,倒数第二行Thepo